package Alibaba;

import common.ListNode;

/**
 * @author zhangmin
 * @create 2022-01-18 16:29
 */
public class mergeKLists23 {
    /*
    * 23. 合并K个升序链表
    * 给你一个链表数组，每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中，返回合并后的链表。
    * 分治：化分到最后剩两个链表，然后合并
    * */
    public ListNode mergeKLists(ListNode[] lists) {
        return merge(lists,0,lists.length-1);
    }
    ListNode merge(ListNode[] lists,int left,int right){
        if (left==right) return lists[left];
        if (left>right) return null;
        int mid=left+(right-left)/2;
        return mergeTwo(merge(lists,left,mid),merge(lists,mid+1,right));
    }
    ListNode mergeTwo(ListNode list1,ListNode list2){
        if (list1==null) return list2;
        if (list2==null) return list1;
        ListNode head=new ListNode(-1);
        ListNode p=head;
        while (list1!=null&&list2!=null){
            if (list1.val<=list2.val){
                p.next=new ListNode(list1.val);
                list1=list1.next;
            }else {
                p.next=new ListNode(list2.val);
                list2=list2.next;
            }
            p=p.next;
        }
        p.next=list1==null?list2:list1;
        return head.next;
    }
}
